package cn.demoncat.util.zookeeper.entity;

import java.util.List;

import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.demoncat.util.io.CloseUtil;
import cn.demoncat.util.lang.StringUtil;

/**
 * ZK 监听器执行的任务
 * 
 * 注意：使用时根据不同的监听目标，实现对应的watch方法
 * 
 * @author 延晓磊
 *
 * @since 2018年11月3日
 */
public abstract class ZkWatchTask{

	private static final Logger LOG = LoggerFactory.getLogger(ZkWatchTask.class);
	
	/**
	 * 树型节点监听 - 监听所有后代节点的创建、更新、删除事件
	 * 
	 * @param watcher	监听器
	 * @param event		事件
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月3日
	 */
	public void watch(TreeCache watcher, TreeCacheEvent event) {
		if (LOG.isDebugEnabled()) {
			// 获取当前节点
			ChildData currentData = event.getData();
			LOG.debug("节点路径：" + currentData.getPath());
			LOG.debug("节点数据：" + StringUtil.getStr(currentData.getData()));
			LOG.debug("节点状态：" + currentData.getStat());
			// 事件类型：节点增、删、改、丢失、初始化等
			TreeCacheEvent.Type type = event.getType();
			LOG.debug("事件类型：" + type);
			// 关闭Watcher
			CloseUtil.close(watcher); 
		}
	}
	
	/**
	 * 子节点监听 - 监听所有子节点的创建、更新、删除事件
	 * 
	 * @param watcher	监听器
	 * @param event		事件
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月3日
	 */
	public void watch(PathChildrenCache watcher, PathChildrenCacheEvent event) {
		if (LOG.isDebugEnabled()) {
			// 获取当前节点
			ChildData currentData = event.getData();
			LOG.debug("节点路径：" + currentData.getPath());
			LOG.debug("节点数据：" + StringUtil.getStr(currentData.getData()));
			LOG.debug("节点状态：" + currentData.getStat());
			// 事件类型：节点增、删、改、丢失、初始化等
			PathChildrenCacheEvent.Type type = event.getType();
			LOG.debug("事件类型：" + type);
			// 所有子节点的初始缓存数据
			List<ChildData> initialData = event.getInitialData();
			if (initialData != null) {
				LOG.debug("通过Event获取所有初始缓存的子节点：" + initialData.size());
			}
			// 事件回调中执行客户端操作
			List<ChildData> currentDatas = watcher.getCurrentData();
			LOG.debug("通过Watcher获取所有子节点：" + currentDatas.size());
			// 关闭Watcher
			CloseUtil.close(watcher);
		}
	}
	
	/**
	 * 节点监听 - 监听节点的创建、更新、删除事件
	 * 
	 * @param watcher	监听器
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月3日
	 */
	public void watch(NodeCache watcher) {
		if (LOG.isDebugEnabled()) {
			// 获取当前节点
			ChildData currentData = watcher.getCurrentData();
			LOG.debug("节点路径：" + currentData.getPath());
			LOG.debug("节点数据：" + StringUtil.getStr(currentData.getData()));
			LOG.debug("节点状态：" + currentData.getStat());
			// 关闭Watcher
			CloseUtil.close(watcher);
		}
	}
}
